#include <iostream>
#include <muduo/net/TcpServer.h> //调用muduo库中的TcpServer类
#include <muduo/net/EventLoop.h> //调用muduo库中的EventLoop类
#include <muduo/net/TcpConnection.h> //调用muduo库中的TcpConnection类
#include <muduo/net/Buffer.h> //调用muduo库中的Buffer类
#include <unordered_map>

class Dirserve
{
public:
    Dirserve(int port) : _server(&_loop, muduo::net::InetAddress("0.0.0.0", port), "Dirserve", muduo::net::TcpServer::kReusePort)
    {
        _server.setConnectionCallback(std::bind(&Dirserve::OnConnection, this, std::placeholders::_1));//注册连接时的回调函数
        _server.setMessageCallback(std::bind(&Dirserve::OnMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
                                                                                    //注册接收到消息时的回调函数
    }
    void start()
    {
        _server.start(); //启动服务
        _loop.loop();    //启动事件循环
    }

    void OnConnection(const muduo::net::TcpConnectionPtr &conn)//连接时的回调函数
    {
        if (conn->connected())
            std::cout << "Connected" << std::endl;//打印连接信息
        else
            std::cout << "Disconnected" << std::endl;
    }

    void Print(std::unordered_map<std::string, std::string> &dir)
    {
        for (auto &e : dir)
        {
            std::cout << e.first << ":" << e.second << std::endl;
        }
    }

    void OnMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp time)//接收到消息时的回调函数
    {
        std::string meg = buf->retrieveAllAsString();
        static std::unordered_map<std::string, std::string> dict_map = {
            {"Hello", "你好"},
            {"你好", " Hello "},
            {"World", "世界"},
            {"世界", " World "},
        };
        auto it = dict_map.find(meg);
        if (it == dict_map.end())
        {
            conn->send("没有找到对应的信息\n");
        }
        else
        {
            conn->send(it->second);
        }
    }

private:
    muduo::net::EventLoop _loop;    //muduo库中的EventLoop类，出发IO事件,用于事件循环
    muduo::net::TcpServer _server; //muduo库中的TcpServer类，接收连接请求
};

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "请指定端口" << std::endl;
    }
    int port = std::atoi(argv[1]);
    Dirserve dirserve(port);
    dirserve.start();
    return 0;
}